﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using TccServicos.Models;
using TccServicos.Util;

namespace TccServicos.Controllers
{
    public class NotificacaoPersonalizadaController : ApiController
    {
        private string sThread = "";

        [HttpPost]
        public RetornoServico EnviaNotificacao(NotificacaoPayload notificacao)
        {
            sThread = Util.Util.NextHex(4);
            string nomeFuncao = string.Format("{0} [{1}]", "EnviaNotificacao", sThread);

            try
            {
                using (adoteEntities contexto = new adoteEntities())
                {
                    List<int> excluir = new List<int>();
                    var lista = (from t in contexto.CADASTRO_PESSOA_FILTRO.AsNoTracking()
                                 join p in contexto.CADASTRO_PESSOA.AsNoTracking() on t.ID_CADASTRO_PESSOA equals p.ID_CADASTRO_PESSOA
                                 select new 
                                 {
                                     t.ID_FILTRO,
                                     t.ID_GENERO,
                                     t.ID_RACA,
                                     t.ID_PORTE,
                                     t.ID_UF,
                                     t.ID_CIDADE,
                                     t.IDADE_MIN,
                                     t.IDADE_MAX,
                                     t.PESO_MIN,
                                     t.PESO_MAX,
                                     p.TOKEN,
                                 }).ToList();

                    foreach (var item in lista)
                    {
                        var consulta = (from t in contexto.CADASTRO_ANIMAL.AsNoTracking()
                                        select t);
                        if (item.ID_GENERO.HasValue && item.ID_GENERO.Value > 0)
                            consulta = consulta.Where(x => x.ID_GENERO == item.ID_GENERO.Value);
                        if (item.ID_RACA.HasValue && item.ID_RACA.Value > 0)
                            consulta = consulta.Where(x => x.ID_RACA == item.ID_RACA.Value);
                        if (item.ID_PORTE.HasValue && item.ID_PORTE.Value > 0)
                            consulta = consulta.Where(x => x.ID_PORTE == item.ID_PORTE.Value);
                        if (item.ID_UF.HasValue && item.ID_UF.Value > 0)
                            consulta = consulta.Where(x => x.ID_UF == item.ID_UF.Value);
                        if (item.ID_CIDADE.HasValue && item.ID_CIDADE.Value > 0)
                            consulta = consulta.Where(x => x.ID_CIDADE == item.ID_CIDADE.Value);
                        if (item.IDADE_MIN.HasValue && item.IDADE_MIN.Value > 0)
                            consulta = consulta.Where(x => x.IDADE >= item.IDADE_MIN.Value);
                        if (item.IDADE_MAX.HasValue && item.IDADE_MAX.Value > 0)
                            consulta = consulta.Where(x => x.IDADE <= item.IDADE_MAX.Value);
                        if (item.PESO_MIN.HasValue && item.PESO_MIN.Value > 0)
                            consulta = consulta.Where(x => x.PESO >= item.PESO_MIN.Value);
                        if (item.PESO_MAX.HasValue && item.PESO_MAX.Value > 0)
                            consulta = consulta.Where(x => x.PESO <= item.PESO_MAX.Value);
                        var resultadoPesquisa = consulta.Select(x => x.ID_CADASTRO_ANIMAL).FirstOrDefault();
                        
                        if (resultadoPesquisa > 0)
                        {
                            if (!string.IsNullOrEmpty(item.TOKEN))
                            {
                                Negocio.Notificacao notification = new Negocio.Notificacao();
                                notification.SendNotification(item.TOKEN, "Encontramos seu animal, entre no app e confira",
                                    (item.TOKEN != "6db992177e09945a004f9ef57a660e546fb2e37b1cd3d670769591af2ef2cef3" ? true : false));
                            }
                            excluir.Add(item.ID_FILTRO);
                        }
                    }

                    foreach (var item in excluir)
                    {
                        var objetoSalvar = (from t in contexto.CADASTRO_PESSOA_FILTRO
                                            where t.ID_FILTRO == item
                                            select t).FirstOrDefault();
                        contexto.CADASTRO_PESSOA_FILTRO.Attach(objetoSalvar);
                        contexto.Entry(objetoSalvar).State = System.Data.EntityState.Deleted;
                        contexto.SaveChanges();
                    }
                }

                return Util.Util.RetornoOk();

            }
            catch (Exception ex)
            {
                Log.GravarLog(string.Format("{0} Erro: {1}", nomeFuncao, ex.ToString()));
                return Util.Util.RetornoErro(ex.ToString());
            }
        }
    }
}
